Add a new error code
authorMatthias Clasen <mclasen@redhat.com>
Sun, 29 Apr 2007 06:23:58 +0000 (06:23 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Sun, 29 Apr 2007 06:23:58 +0000 (06:23 +0000)
2007-04-29  Matthias Clasen  <mclasen@redhat.com>

        * gtk/gtkprintoperation.h: Add a new error code

        * gtk/gtk.symbols:
        * gtk/gtkpagesetup.[hc]:
        * gtk/gtkpapersize.[hc]:
        * gtk/gtkprintsettings.[hc]: Add functions to serialize
        and deserialize page setups and print settings to files
        and key files.  (#344515, Christian Persch)

        * gtk/gtkpagesetupunixdialog.c: Adapt to the new functions.

        * tests/print-editor.c: Use the new functions to persist
        page setup and print settings.

svn path=/trunk/; revision=17697

13 files changed:
ChangeLog
docs/reference/ChangeLog
docs/reference/gtk/gtk-sections.txt
gtk/gtk.symbols
gtk/gtkpagesetup.c
gtk/gtkpagesetup.h
gtk/gtkpagesetupunixdialog.c
gtk/gtkpapersize.c
gtk/gtkpapersize.h
gtk/gtkprintoperation.h
gtk/gtkprintsettings.c
gtk/gtkprintsettings.h
tests/print-editor.c

index 5ea8e2bcd4bddcdd5b4e21bb133b2c90257f2af3..ac54424caf5eb2ae72a09657eb3a7b1ccfc4173b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2007-04-29  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtkprintoperation.h: Add a new error code
+
+       * gtk/gtk.symbols:
+       * gtk/gtkpagesetup.[hc]:
+       * gtk/gtkpapersize.[hc]:
+       * gtk/gtkprintsettings.[hc]: Add functions to serialize 
+       and deserialize page setups and print settings to files 
+       and key files.  (#344515, Christian Persch)
+
+       * gtk/gtkpagesetupunixdialog.c: Adapt to the new functions.
+
+       * tests/print-editor.c: Use the new functions to persist 
+       page setup and print settings.
+
 2007-04-29  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkpagesetupunixdialog.c (gtk_page_setup_unix_dialog_finalize):
index d6e37db5f8c4d0a4848c332900b8244924d1e010..64c9b109009779058c8ecb6c1580944c61925304 100644 (file)
@@ -1,3 +1,8 @@
+2007-04-29  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtk-sections.txt: Add new functions to serialize/
+       deserialize page setups and print settings.
+
 2007-04-29  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtk-sections.txt: Add gtk_paper_size_get_builtins
index 24ecc7437a16b2d9acc8fd0a81e29002f44dc4ff..5e4c3fdd246a88df0fc6763bd8d8768f416820d0 100644 (file)
@@ -6332,6 +6332,11 @@ GTK_PRINT_SETTINGS_OUTPUT_URI
 GTK_PRINT_SETTINGS_WIN32_DRIVER_EXTRA
 GTK_PRINT_SETTINGS_WIN32_DRIVER_VERSION
 
+<SUBSECTION Serialization>
+gtk_print_settings_new_from_file
+gtk_print_settings_new_from_key_file
+gtk_print_settings_to_file
+gtk_print_settings_to_key_file
 
 <SUBSECTION Standard>
 GTK_TYPE_PRINT_SETTINGS
@@ -6375,6 +6380,10 @@ gtk_paper_size_get_default_left_margin
 gtk_paper_size_get_default_right_margin
 gtk_paper_size_get_default
 
+<SUBSECTION Serialization>
+gtk_paper_size_new_from_key_file
+gtk_paper_size_to_key_file
+
 <SUBSECTION Standard>
 GTK_TYPE_PAPER_SIZE
 <SUBSECTION Private>
@@ -6406,6 +6415,12 @@ gtk_page_setup_get_paper_height
 gtk_page_setup_get_page_width
 gtk_page_setup_get_page_height
 
+<SUBSECTION Serialization>
+gtk_page_setup_new_from_file
+gtk_page_setup_new_from_key_file
+gtk_page_setup_to_file
+gtk_page_setup_to_key_file
+
 <SUBSECTION Standard>
 GTK_TYPE_PAGE_SETUP
 GTK_PAGE_SETUP
index ada3a398d16c526aa096e41a53637d62c38a466c..0f981c416f21245173ffda004683a2ca6f7034a3 100644 (file)
@@ -2512,6 +2512,10 @@ gtk_preview_uninit
 #if IN_FILE(__GTK_PAGE_SETUP_C__)
 gtk_page_setup_get_type G_GNUC_CONST
 gtk_page_setup_new
+gtk_page_setup_new_from_file
+gtk_page_setup_new_from_key_file
+gtk_page_setup_to_file
+gtk_page_setup_to_key_file
 gtk_page_setup_copy
 gtk_page_setup_get_orientation
 gtk_page_setup_set_orientation
@@ -2552,6 +2556,8 @@ gtk_paper_size_get_type G_GNUC_CONST
 gtk_paper_size_new
 gtk_paper_size_new_from_ppd
 gtk_paper_size_new_custom
+gtk_paper_size_new_from_key_file
+gtk_paper_size_to_key_file
 gtk_paper_size_copy
 gtk_paper_size_free
 gtk_paper_size_is_equal
@@ -2772,6 +2778,10 @@ gtk_print_run_page_setup_dialog_async
 #if IN_FILE(__GTK_PRINT_SETTINGS_C__)
 gtk_print_settings_get_type G_GNUC_CONST
 gtk_print_settings_new
+gtk_print_settings_new_from_file
+gtk_print_settings_new_from_key_file
+gtk_print_settings_to_file
+gtk_print_settings_to_key_file
 gtk_print_settings_copy
 gtk_print_settings_has_key
 gtk_print_settings_get
index c216dc8706d2b36c11d2d95c13331f4ae3052461..bb3e49b3b159e26e411b30f59fc6fc64e49def94 100644 (file)
 
 #include "gtkpagesetup.h"
 #include "gtkprintutils.h"
+#include "gtkprintoperation.h" /* for GtkPrintError */
+#include "gtkintl.h"
+#include "gtktypebuiltins.h"
 #include "gtkalias.h"
 
+#define KEYFILE_GROUP_NAME "Page Setup"
 
 typedef struct _GtkPageSetupClass GtkPageSetupClass;
 
@@ -468,5 +472,261 @@ gtk_page_setup_get_page_height (GtkPageSetup *setup,
 }
 
 
+/**
+ * gtk_page_setup_new_from_file:
+ * @file_name: the filename to read the page setup from
+ * @error: return location for an error, or %NULL
+ * 
+ * Reads the page setup from the file @file_name. Returns a 
+ * new #GtkPageSetup object with the restored page setup, 
+ * or %NULL if an error occurred. See gtk_page_setup_to_file().
+ *
+ * Return value: the restored #GtkPageSetup
+ * 
+ * Since: 2.12
+ */
+GtkPageSetup *
+gtk_page_setup_new_from_file (const gchar  *file_name,
+                             GError      **error)
+{
+  GtkPageSetup *page_setup;
+  GKeyFile *key_file;
+  GError *err = NULL;
+
+  g_return_val_if_fail (file_name != NULL, NULL);
+
+  key_file = g_key_file_new ();
+  if (!g_key_file_load_from_file (key_file, file_name, 0, &err))
+    {
+      g_key_file_free (key_file);
+      g_propagate_error (error, err);
+      return NULL;
+    }
+
+  page_setup = gtk_page_setup_new_from_key_file (key_file, NULL, error);
+  g_key_file_free (key_file);
+
+  return page_setup;
+}
+
+/* something like this should really be in gobject! */
+static guint
+string_to_enum (GType type,
+                const char *enum_string)
+{
+  GEnumClass *enum_class;
+  const GEnumValue *value;
+  guint retval = 0;
+
+  g_return_val_if_fail (enum_string != NULL, 0);
+
+  enum_class = g_type_class_ref (type);
+  value = g_enum_get_value_by_nick (enum_class, enum_string);
+  if (value)
+    retval = value->value;
+
+  g_type_class_unref (enum_class);
+
+  return retval;
+}
+
+/**
+ * gtk_page_setup_new_from_key_file:
+ * @key_file: the #GKeyFile to retrieve the page_setup from
+ * @group_name: the name of the group in the key_file to read, or %NULL
+ *              to use the default name "Page Setup"
+ * @error: return location for an error, or %NULL
+ * 
+ * Reads the page setup from the group @group_name in the key file
+ * @key_file. Returns a new #GtkPageSetup object with the restored
+ * page setup, or %NULL if an error occurred.
+ *
+ * Return value: the restored #GtkPageSetup
+ * 
+ * Since: 2.12
+ */
+GtkPageSetup *
+gtk_page_setup_new_from_key_file (GKeyFile     *key_file,
+                                 const gchar  *group_name,
+                                 GError      **error)
+{
+  GtkPageSetup *page_setup = NULL;
+  GtkPaperSize *paper_size;
+  gdouble top, bottom, left, right;
+  char *orientation = NULL, *freeme = NULL;
+  gboolean retval = TRUE;
+  GError *err = NULL;
+
+  g_return_val_if_fail (key_file != NULL, NULL);
+
+  if (!group_name)
+    group_name = KEYFILE_GROUP_NAME;
+
+  if (!g_key_file_has_group (key_file, group_name))
+    {
+      g_set_error (error,
+                  GTK_PRINT_ERROR,
+                  GTK_PRINT_ERROR_INVALID_FILE,
+                  _("Not a valid page setup file"));
+      retval = FALSE;
+      goto out;
+    }
+
+#define GET_DOUBLE(kf, group, name, v) \
+  v = g_key_file_get_double (kf, group, name, &err); \
+  if (err != NULL) \
+    { \
+      g_propagate_error (error, err);\
+      retval = FALSE;\
+      goto out;\
+    }
+
+  GET_DOUBLE (key_file, group_name, "MarginTop", top);
+  GET_DOUBLE (key_file, group_name, "MarginBottom", bottom);
+  GET_DOUBLE (key_file, group_name, "MarginLeft", left);
+  GET_DOUBLE (key_file, group_name, "MarginRight", right);
+
+#undef GET_DOUBLE
+
+  paper_size = gtk_paper_size_new_from_key_file (key_file, group_name, &err);
+  if (!paper_size)
+    {
+      g_propagate_error (error, err);
+      goto out;
+    }
+
+  page_setup = gtk_page_setup_new ();
+  gtk_page_setup_set_paper_size (page_setup, paper_size);
+  gtk_paper_size_free (paper_size);
+
+  gtk_page_setup_set_top_margin (page_setup, top, GTK_UNIT_MM);
+  gtk_page_setup_set_bottom_margin (page_setup, bottom, GTK_UNIT_MM);
+  gtk_page_setup_set_left_margin (page_setup, left, GTK_UNIT_MM);
+  gtk_page_setup_set_right_margin (page_setup, right, GTK_UNIT_MM);
+
+  orientation = g_key_file_get_string (key_file, group_name,
+                                      "Orientation", NULL);
+  if (orientation)
+    {
+      gtk_page_setup_set_orientation (page_setup,
+                                     string_to_enum (GTK_TYPE_PAGE_ORIENTATION,
+                                                     orientation));
+      g_free (orientation);
+    }
+
+out:
+  g_free (freeme);
+
+  return page_setup;
+}
+
+/**
+ * gtk_page_setup_to_file:
+ * @page_setup: a #GtkPageSetup
+ * @file_name: the file to save to
+ * @error: return location for errors, or %NULL
+ * 
+ * This function saves the print page_setup from @page_setup 
+ * to @file_name.
+ * 
+ * Return value: %TRUE on success
+ *
+ * Since: 2.12
+ */
+gboolean
+gtk_page_setup_to_file (GtkPageSetup  *page_setup,
+                       const char    *file_name,
+                       GError       **error)
+{
+  GKeyFile *key_file;
+  gboolean retval = FALSE;
+  char *data = NULL;
+  gsize len;
+
+  g_return_val_if_fail (GTK_IS_PAGE_SETUP (page_setup), FALSE);
+  g_return_val_if_fail (file_name != NULL, FALSE);
+
+  key_file = g_key_file_new ();
+  gtk_page_setup_to_key_file (page_setup, key_file, NULL);
+
+  data = g_key_file_to_data (key_file, &len, error);
+  if (!data)
+    goto out;
+
+  retval = g_file_set_contents (file_name, data, len, error);
+
+out:
+  g_key_file_free (key_file);
+  g_free (data);
+
+  return retval;
+}
+
+/* something like this should really be in gobject! */
+static char *
+enum_to_string (GType type,
+                guint enum_value)
+{
+  GEnumClass *enum_class;
+  GEnumValue *value;
+  char *retval = NULL;
+
+  enum_class = g_type_class_ref (type);
+
+  value = g_enum_get_value (enum_class, enum_value);
+  if (value)
+    retval = g_strdup (value->value_nick);
+
+  g_type_class_unref (enum_class);
+
+  return retval;
+}
+
+/**
+ * gtk_page_setup_to_key_file:
+ * @page_setup: a #GtkPageSetup
+ * @key_file: the #GKeyFile to save the page setup to
+ * @group_name: the group to add the settings to in @key_file, 
+ *      or %NULL to use the default name "Page Setup"
+ * 
+ * This function adds the page setup from @page_setup to @key_file.
+ * 
+ * Since: 2.12
+ */
+void
+gtk_page_setup_to_key_file (GtkPageSetup *page_setup,
+                           GKeyFile     *key_file,
+                           const gchar  *group_name)
+{
+  GtkPaperSize *paper_size;
+  char *orientation;
+
+  g_return_if_fail (GTK_IS_PAGE_SETUP (page_setup));
+  g_return_if_fail (key_file != NULL);
+
+  if (!group_name)
+    group_name = KEYFILE_GROUP_NAME;
+
+  paper_size = gtk_page_setup_get_paper_size (page_setup);
+  g_assert (paper_size != NULL);
+
+  gtk_paper_size_to_key_file (paper_size, key_file, group_name);
+
+  g_key_file_set_double (key_file, group_name,
+                        "MarginTop", gtk_page_setup_get_top_margin (page_setup, GTK_UNIT_MM));
+  g_key_file_set_double (key_file, group_name,
+                        "MarginBottom", gtk_page_setup_get_bottom_margin (page_setup, GTK_UNIT_MM));
+  g_key_file_set_double (key_file, group_name,
+                        "MarginLeft", gtk_page_setup_get_left_margin (page_setup, GTK_UNIT_MM));
+  g_key_file_set_double (key_file, group_name,
+                        "MarginRight", gtk_page_setup_get_right_margin (page_setup, GTK_UNIT_MM));
+
+  orientation = enum_to_string (GTK_TYPE_PAGE_ORIENTATION,
+                               gtk_page_setup_get_orientation (page_setup));
+  g_key_file_set_string (key_file, group_name,
+                        "Orientation", orientation);
+  g_free (orientation);
+}
+
 #define __GTK_PAGE_SETUP_C__
 #include "gtkaliasdef.c"
index f52e0bfedae83ee11eef81e64f099c82f46c18e9..6de2ef5f3f4e84bf4549ffdcc2da7fa90d0099ee 100644 (file)
@@ -79,6 +79,18 @@ gdouble            gtk_page_setup_get_page_width    (GtkPageSetup       *setup,
 gdouble            gtk_page_setup_get_page_height   (GtkPageSetup       *setup,
                                                     GtkUnit             unit);
 
+/* Saving and restoring page setup */
+GtkPageSetup     *gtk_page_setup_new_from_file     (const gchar         *file_name,
+                                                    GError              **error);
+gboolean          gtk_page_setup_to_file           (GtkPageSetup        *setup,
+                                                    const char          *file_name,
+                                                    GError             **error);
+GtkPageSetup     *gtk_page_setup_new_from_key_file (GKeyFile            *key_file,
+                                                    const gchar         *group_name,
+                                                    GError             **error);
+void              gtk_page_setup_to_key_file       (GtkPageSetup        *setup,
+                                                    GKeyFile            *key_file,
+                                                    const gchar         *group_name);
 
 G_END_DECLS
 
index 73742cd009a381db03eb2676759dce36395caba3..638d480bfa357a17f72a6797a165548249a03974 100644 (file)
@@ -204,51 +204,18 @@ load_custom_papers (GtkListStore *store)
   groups = g_key_file_get_groups (keyfile, &n_groups);
   for (i = 0; i < n_groups; ++i)
     {
-      GError *error = NULL;
-      gdouble w, h, top, bottom, left, right;
-      GtkPaperSize *paper_size;
       GtkPageSetup *page_setup;
-      gchar *name;
       GtkTreeIter iter;
 
-      name = g_key_file_get_value (keyfile, groups[i], "Name", NULL);
-      if (!name)
+      page_setup = gtk_page_setup_new_from_key_file (keyfile, groups[i], NULL);
+      if (!page_setup)
         continue;
 
-#define GET_DOUBLE(kf, name, v) \
-      v = g_key_file_get_double (kf, groups[i], name, &error); \
-      if (error != NULL) \
-        {\
-          g_error_free (error);\
-          continue;\
-        }
-
-      GET_DOUBLE (keyfile, "Width", w);
-      GET_DOUBLE (keyfile, "Height", h);
-      GET_DOUBLE (keyfile, "MarginTop", top);
-      GET_DOUBLE (keyfile, "MarginBottom", bottom);
-      GET_DOUBLE (keyfile, "MarginLeft", left);
-      GET_DOUBLE (keyfile, "MarginRight", right);
-
-#undef GET_DOUBLE
-
-      page_setup = gtk_page_setup_new ();
-      paper_size = gtk_paper_size_new_custom (name, name, w, h, GTK_UNIT_MM);
-      gtk_page_setup_set_paper_size (page_setup, paper_size);
-      gtk_paper_size_free (paper_size);
-
-      gtk_page_setup_set_top_margin (page_setup, top, GTK_UNIT_MM);
-      gtk_page_setup_set_bottom_margin (page_setup, bottom, GTK_UNIT_MM);
-      gtk_page_setup_set_left_margin (page_setup, left, GTK_UNIT_MM);
-      gtk_page_setup_set_right_margin (page_setup, right, GTK_UNIT_MM);
-
       gtk_list_store_append (store, &iter);
       gtk_list_store_set (store, &iter,
                          0, page_setup, 
                          -1);
-
       g_object_unref (page_setup);
-      g_free (name);
     }
  
   g_strfreev (groups);
@@ -271,7 +238,6 @@ save_custom_papers (GtkListStore *store)
     {
       do
        {
-         GtkPaperSize *paper_size;
          GtkPageSetup *page_setup;
          gchar group[32];
 
@@ -279,21 +245,7 @@ save_custom_papers (GtkListStore *store)
 
          gtk_tree_model_get (model, &iter, 0, &page_setup, -1);
 
-         paper_size = gtk_page_setup_get_paper_size (page_setup);
-         g_key_file_set_string (keyfile, group, "Name", gtk_paper_size_get_name (paper_size));
-
-         g_key_file_set_double (keyfile, group, "Width",
-                                gtk_page_setup_get_paper_width (page_setup, GTK_UNIT_MM));
-         g_key_file_set_double (keyfile, group, "Height",
-                                gtk_page_setup_get_paper_height (page_setup, GTK_UNIT_MM));
-         g_key_file_set_double (keyfile, group, "MarginTop",
-                                gtk_page_setup_get_top_margin (page_setup, GTK_UNIT_MM));
-         g_key_file_set_double (keyfile, group, "MarginBottom",
-                                gtk_page_setup_get_bottom_margin (page_setup, GTK_UNIT_MM));
-         g_key_file_set_double (keyfile, group, "MarginLeft",
-                                gtk_page_setup_get_left_margin (page_setup, GTK_UNIT_MM));
-         g_key_file_set_double (keyfile, group, "MarginRight",
-                                gtk_page_setup_get_right_margin (page_setup, GTK_UNIT_MM));
+         gtk_page_setup_to_key_file (page_setup, keyfile, group);
          
          ++i;
        } while (gtk_tree_model_iter_next (model, &iter));
index be21faf68eb2adf16226f2d7791c779cacad6bbd..c5613275ab36cd25f74817d2041e444ea020c146 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "gtkpapersize.h"
 #include "gtkprintutils.h"
+#include "gtkprintoperation.h"  /* for GtkPrintError */
 #include "gtkintl.h"
 #include "gtkalias.h"
 
@@ -759,6 +760,135 @@ gtk_paper_size_get_default_right_margin (GtkPaperSize *size,
   return _gtk_print_convert_from_mm (margin, unit);
 }
 
+/**
+ * gtk_paper_size_new_from_key_file:
+ * @key_file: the #GKeyFile to retrieve the papersize from
+ * @group_name: the name ofthe group in the key file to read,
+ *     or %NULL to read the first group
+ * @error: return location for an error, or %NULL
+ *
+ * Reads a paper size from the group @group_name in the key file
+ * @key_file. Returns a new #GtkPaperSize object with the restored
+ * paper size, or %NULL if an error occurred.
+ *
+ * Since: 2.12
+ */
+GtkPaperSize *
+gtk_paper_size_new_from_key_file (GKeyFile    *key_file,
+                                 const gchar *group_name,
+                                 GError     **error)
+{
+  GtkPaperSize *paper_size = NULL;
+  char *name = NULL, *ppd_name = NULL, *display_name = NULL, *freeme = NULL;
+  gdouble width, height;
+  gboolean retval = TRUE;
+  GError *err = NULL;
+
+  g_return_val_if_fail (key_file != NULL, NULL);
+
+  if (!group_name)
+    group_name = freeme = g_key_file_get_start_group (key_file);
+  if (!group_name || !g_key_file_has_group (key_file, group_name))
+    {
+      g_set_error (error,
+                  GTK_PRINT_ERROR,
+                  GTK_PRINT_ERROR_INVALID_FILE,
+                  _("Not a valid page setup file"));
+      retval = FALSE;
+      goto out;
+    }
+
+#define GET_DOUBLE(kf, group, name, v) \
+  v = g_key_file_get_double (kf, group, name, &err); \
+  if (err != NULL) \
+    {\
+      g_propagate_error (error, err);\
+      retval = FALSE;\
+      goto out;\
+    }
+
+  GET_DOUBLE (key_file, group_name, "Width", width);
+  GET_DOUBLE (key_file, group_name, "Height", height);
+
+#undef GET_DOUBLE
+
+  name = g_key_file_get_string (key_file, group_name,
+                               "Name", NULL);
+  ppd_name = g_key_file_get_string (key_file, group_name,
+                                   "PPDName", NULL);
+  display_name = g_key_file_get_string (key_file, group_name,
+                                       "DisplayName", NULL);
+  /* Fallback for old ~/.gtk-custom-paper entries */
+  if (!display_name)
+    display_name = g_strdup (name);
+
+  if (ppd_name != NULL)
+    paper_size = gtk_paper_size_new_from_ppd (ppd_name, display_name,
+                                             width, height);
+  else if (name != NULL)
+    paper_size = gtk_paper_size_new_custom (name, display_name,
+                                           width, height, GTK_UNIT_MM);
+  else
+    {
+      g_set_error (error,
+                  GTK_PRINT_ERROR,
+                  GTK_PRINT_ERROR_INVALID_FILE,
+                  _("Not a valid page setup file"));
+      retval = FALSE;
+      goto out;
+    }
+  g_assert (paper_size != NULL);
+
+out:
+  g_free (ppd_name);
+  g_free (name);
+  g_free (display_name);
+  g_free (freeme);
+
+  return paper_size;
+}
+
+/**
+ * gtk_paper_size_to_key_file:
+ * @paper_size: a #GtkPaperSize
+ * @key_file: the #GKeyFile to save the paper size to
+ * @group_name: the group to add the settings to in @key_file
+ *
+ * This function adds the paper size from @paper_size to @key_file.
+ *
+ * Since: 2.12
+ */
+void
+gtk_paper_size_to_key_file (GtkPaperSize *paper_size,
+                           GKeyFile     *key_file,
+                           const gchar  *group_name)
+{
+  const char *name, *ppd_name, *display_name;
+
+  g_return_if_fail (paper_size != NULL);
+  g_return_if_fail (key_file != NULL);
+
+  name = gtk_paper_size_get_name (paper_size);
+  display_name = gtk_paper_size_get_display_name (paper_size);
+  ppd_name = gtk_paper_size_get_ppd_name (paper_size);
+
+  if (ppd_name != NULL) 
+    g_key_file_set_string (key_file, group_name,
+                          "PPDName", ppd_name);
+  else
+    g_key_file_set_string (key_file, group_name,
+                          "Name", name);
+
+  if (display_name) 
+    g_key_file_set_string (key_file, group_name,
+                          "DisplayName", display_name);
+
+  g_key_file_set_double (key_file, group_name,
+                        "Width", gtk_paper_size_get_width (paper_size, GTK_UNIT_MM));
+  g_key_file_set_double (key_file, group_name,
+                        "Height", gtk_paper_size_get_height (paper_size, GTK_UNIT_MM));
+}
+
 
 #define __GTK_PAPER_SIZE_C__
 #include "gtkaliasdef.c"
index 8709cdf2f42a335146cb507e67ca7db4805f2c22..dc2cfed14e2c127e2263b818f2fb4e2b7da51b2c 100644 (file)
@@ -84,6 +84,13 @@ gdouble gtk_paper_size_get_default_right_margin  (GtkPaperSize *size,
 
 G_CONST_RETURN gchar *gtk_paper_size_get_default (void);
 
+GtkPaperSize *gtk_paper_size_new_from_key_file (GKeyFile    *key_file,
+                                               const gchar *group_name,
+                                               GError     **error);
+void     gtk_paper_size_to_key_file            (GtkPaperSize *size,
+                                               GKeyFile     *key_file,
+                                               const gchar  *group_name);
+
 G_END_DECLS
 
 #endif /* __GTK_PAPER_SIZE_H__ */
index 624a759cb9d49c1d85b473dde2f5a4106463b9ff..d0d3a38647c1a5da33715841c9f30229f6e8556c 100644 (file)
@@ -125,7 +125,8 @@ typedef enum
 {
   GTK_PRINT_ERROR_GENERAL,
   GTK_PRINT_ERROR_INTERNAL_ERROR,
-  GTK_PRINT_ERROR_NOMEM
+  GTK_PRINT_ERROR_NOMEM,
+  GTK_PRINT_ERROR_INVALID_FILE
 } GtkPrintError;
 
 GQuark gtk_print_error_quark (void);
index e80548e3a4a651f1676123447b54cb6188679d7f..f4b19e718fe63260d0f087289013b097b62595cc 100644 (file)
@@ -45,6 +45,8 @@ struct _GtkPrintSettingsClass
   GObjectClass parent_class;
 };
 
+#define KEYFILE_GROUP_NAME "Print Settings"
+
 G_DEFINE_TYPE (GtkPrintSettings, gtk_print_settings, G_TYPE_OBJECT)
 
 static void
@@ -1499,7 +1501,191 @@ gtk_print_settings_set_output_bin (GtkPrintSettings *settings,
 {
   gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_OUTPUT_BIN, output_bin);
 }
+
+/**
+ * gtk_print_settings_new_from_file:
+ * @file_name: the filename to read the settings from
+ * @error: return location for errors, or %NULL
+ * 
+ * Reads the print settings from @filename. Returns a new #GtkPrintSettings
+ * object with the restored settings, or %NULL if an error occurred.
+ * See gtk_print_settings_to_file().
+ *
+ * Return value: the restored #GtkPrintSettings
+ * 
+ * Since: 2.12
+ */
+GtkPrintSettings *
+gtk_print_settings_new_from_file (const gchar  *file_name,
+                                 GError      **error)
+{
+  GtkPrintSettings *settings;
+  GKeyFile *key_file;
+
+  g_return_val_if_fail (file_name != NULL, NULL);
+
+  key_file = g_key_file_new ();
+  if (!g_key_file_load_from_file (key_file, file_name, 0, error))
+    {
+      g_key_file_free (key_file);
+      return NULL;
+    }
+
+  settings = gtk_print_settings_new_from_key_file (key_file, NULL, error);
+  g_key_file_free (key_file);
+
+  return settings;
+}
+
+/**
+ * gtk_print_settings_new_from_key_file:
+ * @key_file: the #GKeyFile to retrieve the settings from
+ * @error: return location for errors, or %NULL
+ * 
+ * Reads the print settings from @key_file. Returns a new #GtkPrintSettings
+ * object with the restored settings, or %NULL if an error occurred.
+ *
+ * Return value: the restored #GtkPrintSettings
+ * 
+ * Since: 2.12
+ */
+GtkPrintSettings *
+gtk_print_settings_new_from_key_file (GKeyFile     *key_file,
+                                     const gchar  *group_name,
+                                     GError      **error)
+{
+  GtkPrintSettings *settings;
+  gchar **keys;
+  gsize n_keys, i;
+  GError *err = NULL;
+
+  g_return_val_if_fail (key_file != NULL, NULL);
+
+  if (!group_name)
+    group_name = KEYFILE_GROUP_NAME;
+
+  keys = g_key_file_get_keys (key_file,
+                             group_name,
+                             &n_keys,
+                             &err);
+  if (err != NULL)
+    {
+      g_propagate_error (error, err);
+      return NULL;
+    }
    
+  settings = gtk_print_settings_new ();
+
+  for (i = 0 ; i < n_keys; ++i)
+    {
+      gchar *value;
+
+      value = g_key_file_get_string (key_file,
+                                    KEYFILE_GROUP_NAME,
+                                    keys[i],
+                                    NULL);
+      if (!value)
+        continue;
+
+      gtk_print_settings_set (settings, keys[i], value);
+      g_free (value);
+    }
+
+  g_strfreev (keys);
+
+  return settings;
+}
+
+/**
+ * gtk_print_settings_to_file:
+ * @settings: a #GtkPrintSettings
+ * @file_name: the file to save to
+ * @error: return location for errors, or %NULL
+ * 
+ * This function saves the print settings from @settings to @file_name.
+ * 
+ * Return value: %TRUE on success
+ *
+ * Since: 2.12
+ */
+gboolean
+gtk_print_settings_to_file (GtkPrintSettings  *settings,
+                           const gchar       *file_name,
+                           GError           **error)
+{
+  GKeyFile *key_file;
+  gboolean retval = FALSE;
+  char *data = NULL;
+  gsize len;
+  GError *err = NULL;
+
+  g_return_val_if_fail (GTK_IS_PRINT_SETTINGS (settings), FALSE);
+  g_return_val_if_fail (file_name != NULL, FALSE);
+
+  key_file = g_key_file_new ();
+  gtk_print_settings_to_key_file (settings, key_file, NULL);
+
+  data = g_key_file_to_data (key_file, &len, &err);
+  if (!data)
+    goto out;
+
+  retval = g_file_set_contents (file_name, data, len, &err);
+
+out:
+  if (err != NULL)
+    g_propagate_error (error, err);
+
+  g_key_file_free (key_file);
+  g_free (data);
+
+  return retval;
+}
+
+typedef struct {
+  GKeyFile *key_file;
+  const gchar *group_name;
+} SettingsData;
+
+static void
+add_value_to_key_file (const gchar  *key,
+                      const gchar  *value,
+                      SettingsData *data)
+{
+  g_key_file_set_string (data->key_file, data->group_name, key, value);
+}
+
+/**
+ * gtk_print_settings_to_key_file:
+ * @settings: a #GtkPrintSettings
+ * @key_file: the #GKeyFile to save the print settings to
+ * @group_name: the group to add the settings to in @key_file, or 
+ *     %NULL to use the default "Print Settings"
+ *
+ * This function adds the print settings from @settings to @key_file.
+ * 
+ * Since: 2.12
+ */
+void
+gtk_print_settings_to_key_file (GtkPrintSettings  *settings,
+                               GKeyFile          *key_file,
+                               const gchar       *group_name)
+{
+  SettingsData data;
+
+  g_return_if_fail (GTK_IS_PRINT_SETTINGS (settings));
+  g_return_if_fail (key_file != NULL);
+
+  if (!group_name)
+    group_name = KEYFILE_GROUP_NAME;
+
+  data.key_file = key_file;
+  data.group_name = group_name;
+
+  gtk_print_settings_foreach (settings,
+                             (GtkPrintSettingsFunc) add_value_to_key_file,
+                             &data);
+}
+
 
 #define __GTK_PRINT_SETTINGS_C__
 #include "gtkaliasdef.c"
index 50d7ef7f5362087116f7177abe46c4691c9abc7f..0e731187c87703fbc3b5759d0e9973283038f758 100644 (file)
@@ -46,6 +46,18 @@ GType             gtk_print_settings_get_type (void) G_GNUC_CONST;
 GtkPrintSettings *gtk_print_settings_new      (void);
 
 GtkPrintSettings *gtk_print_settings_copy                    (GtkPrintSettings     *other);
+
+GtkPrintSettings *gtk_print_settings_new_from_file           (const gchar          *file_name,
+                                                             GError              **error);
+gboolean          gtk_print_settings_to_file                 (GtkPrintSettings     *settings,
+                                                             const gchar          *file_name,
+                                                             GError              **error);
+GtkPrintSettings *gtk_print_settings_new_from_key_file       (GKeyFile             *key_file,
+                                                             const gchar          *group_name,
+                                                             GError              **error);
+void              gtk_print_settings_to_key_file             (GtkPrintSettings     *settings,
+                                                             GKeyFile             *key_file,
+                                                             const gchar          *group_name);
 gboolean          gtk_print_settings_has_key                 (GtkPrintSettings     *settings,
                                                              const gchar          *key);
 G_CONST_RETURN gchar *gtk_print_settings_get                (GtkPrintSettings     *settings,
index 237c34a45e8f2ea6800adf8792583b9a98f0bc3c..3999acf065c32f776a5a98f4b3793a8dec4e6e8a 100644 (file)
@@ -372,9 +372,6 @@ do_page_setup (GtkAction *action)
 {
   GtkPageSetup *new_page_setup;
 
-  if (settings == NULL)
-    settings = gtk_print_settings_new ();
-  
   new_page_setup = gtk_print_run_page_setup_dialog (GTK_WINDOW (main_window),
                                                    page_setup, settings);
 
@@ -830,9 +827,14 @@ create_window (void)
   GtkWidget *sw;
   GtkActionGroup *actions;
   GError *error;
+  GtkWindowGroup *group;
   
   main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
+  group = gtk_window_group_new ();
+  gtk_window_group_add_window (group, GTK_WINDOW (main_window));
+  g_object_unref (group);
+
   gtk_window_set_default_size (GTK_WINDOW (main_window),
                               400, 600);
   
@@ -929,14 +931,42 @@ create_window (void)
 int
 main (int argc, char **argv)
 {
+  GError *error = NULL;
+
   g_set_application_name ("Print editor");
   gtk_init (&argc, &argv);
 
+  settings = gtk_print_settings_new_from_file ("print-settings.ini", &error);
+  if (error) {
+    g_print ("Failed to load print settings: %s\n", error->message);
+    g_clear_error (&error);
+
+    settings = gtk_print_settings_new ();
+  }
+  g_assert (settings != NULL);
+
+  page_setup = gtk_page_setup_new_from_file ("page-setup.ini", &error);
+  if (error) {
+    g_print ("Failed to load page setup: %s\n", error->message);
+    g_clear_error (&error);
+  }
+
   create_window ();
 
   if (argc == 2)
     load_file (argv[1]);
   
   gtk_main ();
+
+  if (!gtk_print_settings_to_file (settings, "print-settings.ini", &error)) {
+    g_print ("Failed to save print settings: %s\n", error->message);
+    g_clear_error (&error);
+  }
+  if (page_setup &&
+      !gtk_page_setup_to_file (page_setup, "page-setup.ini", &error)) {
+    g_print ("Failed to save page setup: %s\n", error->message);
+    g_clear_error (&error);
+  }
+
   return 0;
 }